#include "dyn_seg.h"

u8 dyn_flash_count = 0;
void Dyn_Init(void) {
    GPIO_InitTypeDef GPIO_InitStructure;

    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC | RCC_APB2Periph_GPIOA, ENABLE);

    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz;
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2 |
                                  GPIO_Pin_3 | GPIO_Pin_4 | GPIO_Pin_5 |
                                  GPIO_Pin_6 | GPIO_Pin_7;
    GPIO_Init(GPIOA, &GPIO_InitStructure);
    GPIO_Init(GPIOC, &GPIO_InitStructure);
}

void Dyn_Disp_Raw(u8 wei, u8 data) {
    uint8_t table_dyn[] = {0xc0, 0xf9, 0xa4, 0xb0, 0x99, 0x92, 0x82, 0xf8,
                           0x80, 0x90, 0x88, 0x83, 0xc6, 0xa1, 0x86, 0x8e};
    // 位选

    GPIO_SetBits(GPIOA, wei);
    GPIO_ResetBits(GPIOA, (~wei & 0xff));

    // 送数据
    GPIO_SetBits(GPIOC, table_dyn[data]);
    GPIO_ResetBits(GPIOC, (~table_dyn[data] & 0xff));
}

// 将int型的数据写入到buff数组中
void Data_to_Buff(uint8_t* buff, uint32_t num) {
    buff[0] = num / 10000000;
    buff[1] = num / 1000000 % 10;
    buff[2] = num / 100000 % 10;
    buff[3] = num / 10000 % 10;
    buff[4] = num / 1000 % 10;
    buff[5] = num / 100 % 10;
    buff[6] = num / 10 % 10;
    buff[7] = num % 10;
}

void SEG_Scan_Handler(u8 buff_dyn[], u8 *dyn_flash_count) {
    uint8_t code_dyn_wei_scan[] = {WEI1, WEI2, WEI3, WEI4, WEI5, WEI6, WEI7, WEI8};
    
    // 每次进入中断循环显示数据
    Dyn_Disp_Raw(code_dyn_wei_scan[*dyn_flash_count],
                     buff_dyn[*dyn_flash_count]);
    if (++(*dyn_flash_count) == 8) *dyn_flash_count = 0;
}
